package io.renren.modules.iots.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;

import io.renren.common.utils.PageUtils;
import io.renren.common.utils.ParamUtils;
import io.renren.common.utils.Query;
import io.renren.common.utils.R;
import io.renren.htby.utils.IOTSUtils;
import io.renren.iots.socket.client.SingleSocketWriteThread;
import io.renren.modules.iotp.entity.IOTPBean;
import io.renren.modules.iotp.entity.IOTPBody;
import io.renren.modules.iots.dao.IotsIotserverDao;
import io.renren.modules.iots.entity.IotsEquipmentInfoEntity;
import io.renren.modules.iots.entity.IotsIoserverInfoEntity;
import io.renren.modules.iots.entity.IotsIotserverEntity;
import io.renren.modules.iots.entity.IotsVariableInfoEntity;
import io.renren.modules.iots.service.IotsEquipmentInfoService;
import io.renren.modules.iots.service.IotsIoserverInfoService;
import io.renren.modules.iots.service.IotsIotserverService;
import io.renren.modules.iots.service.IotsVariableInfoService;


@Service("iotsIotserverService")
public class IotsIotserverServiceImpl extends ServiceImpl<IotsIotserverDao, IotsIotserverEntity> implements IotsIotserverService {
	@Autowired
	private IotsIotserverService iotsIotserverService;
	@Autowired
	private IotsIoserverInfoService iotsIoserverInfoService;	
	@Autowired
	private IotsEquipmentInfoService iotsEquipmentInfoService;
	@Autowired
	private IotsVariableInfoService iotsVariableInfoService;
	
    @Override
    public PageUtils queryPage(Map<String, Object> params) {
    	
    	String name = (String) params.get("name");
    	String state = (String) params.get("state");
    	String ip = (String) params.get("ip");
      	String port = (String) params.get("port");
    	
        Page<IotsIotserverEntity> page = this.selectPage(
                new Query<IotsIotserverEntity>(params).getPage(),
                new EntityWrapper<IotsIotserverEntity>()
                	.like(StringUtils.isNotBlank(name), "name", name)
                	.like(StringUtils.isNotBlank(state), "state", state)
                	.like(StringUtils.isNotBlank(ip), "ip", ip)
                	.like(StringUtils.isNotBlank(ip), "port", port)
        );

        return new PageUtils(page);
    }
    
    /**
	 * 发送所有连接 代理 的 配置到 IOTS
	 * 
	 * @author lfy.xys
	 * @date 2018年6月7日
	 *
	 * @param params
	 * @return
	 */
	@Override
	public R sendAllIOTSConfig() {

		// 查询 所有 IOTS
		List<IotsIotserverEntity> IotsList = iotsIotserverService.selectList(null);
		
		// 每个IOTS 发送一个数据
		for (IotsIotserverEntity IotsEntity : IotsList) {
			// 查询数据库，根据 iots的id  得到的  绑定的 ioserver。 即 使用pid查询。
			List<IotsIoserverInfoEntity> list = iotsIoserverInfoService.queryIOServerForPid(IotsEntity.getId());
			
			if(list.size() == 0) {
				continue;
			}
			
			SingleSocketWriteThread.sendMsg( IotsEntity.getIp(), IotsEntity.getPort(), getIOTPBean(list));
		}

		return R.ok().put("result", ParamUtils.TIP_TRUE).put("msg", "已经发送配置。");
	}

	
	/**
	 * 根据 ids，查询需要发送配置 的 IOTS
	 * 
	 * @author lfy.xys
	 * @date 2018年6月7日
	 *
	 * @param params
	 * @return
	 */
	@Override
	public R sendIOTSConfig(Map<String, String> params) {

		// ids 为 IOTS 的id集合，逗号分割。
		String idsStr = (String) params.get("ids");
		String[] ids = idsStr.split(",");
		
		// 每个IOTS 发送一个数据
		for (String id : ids) {
			IotsIotserverEntity IotsEntity = iotsIotserverService.selectById(Long.parseLong(id));
			
			// 查询数据库，根据 iots的id  得到的  绑定的 ioserver。 即 使用pid查询。
			List<IotsIoserverInfoEntity> list = iotsIoserverInfoService.queryIOServerForPid(Long.parseLong(id));
			
			if(list.size() == 0) {
				continue;
			}
			
			SingleSocketWriteThread.sendMsg( IotsEntity.getIp(), IotsEntity.getPort(), getIOTPBean(list));

		}
		
		return R.ok().put("result", ParamUtils.TIP_TRUE).put("msg", "已经发送配置。");
	}
	
	/**
	 * 设置成 IOTPBean 协议体
	 * 
	 * @author lfy.xys
	 * @date 2018年6月27日
	 *
	 * @param list
	 * @return
	 */
	public IOTPBean getIOTPBean(List<IotsIoserverInfoEntity> list) {
		IOTPBean bean = new IOTPBean();
		bean.setTag(0x1011);// 写死
		bean.setType(15);// 配置IOTS 分组 消息
		bean.setSource_id(10001);//
		bean.setSource_type(IOTSUtils.THIS_SYSTEM_ID);// 设置系统 - 源类型号
		bean.setSequence_id(111);// 拼接包使用的id
		// bean.setSequence_sub_id(0);// 不手动
		// bean.setLicense("");

		IOTPBody body = new IOTPBody();
		body.setSubtype(1);// 是什么消息体

		// 设置协议体
		List<String> bodyList = new ArrayList<String>();
		for (IotsIoserverInfoEntity entity : list) {
			String json = JSONObject.toJSONString(entity);
			System.out.println(json);
			bodyList.add(json);
		}
		
		body.setBodyList(bodyList);

		bean.setBody(body);
		bean.setEnd(0x1213);

		return bean;
	}
	

	/**
	 * 查询分组下 的 设备 和 变量信息
	 * 
	 * @author lfy.xys
	 * @date 2018年6月25日
	 *
	 * @param params
	 * @return
	 */
	@Override
	public R queryEqmVar(@RequestParam Map<String, String> params) {

		// 1、先查询 设备
		List<IotsEquipmentInfoEntity> eqmEntitys = iotsEquipmentInfoService.queryEqmForPid(params);
		int n = eqmEntitys.size();
		if(n == 0) {
			// 没有设备数据
			return R.ok().put("child", eqmEntitys);
		}
		
		Long[] pids = new Long[n];// 设备的 id集合。
		for (int i = 0; i < n; i++) {
			pids[i] = eqmEntitys.get(i).getId();
		}

		// 2、查询 所有设备的 变量的 集合。
		List<IotsVariableInfoEntity> varEntitys = iotsVariableInfoService.queryByPidsMap(pids);

		// 3、根据 变量的 设备id，分配
		// 循环 遍历 数量小的数据。 所以 数量大的 数据 放外面。
		for (IotsVariableInfoEntity varEntity : varEntitys) {
			for (IotsEquipmentInfoEntity eqmEntity : eqmEntitys) {
				// 设备id = 变量pid，匹配上则放置到 子list中
				if (varEntity.getPid() == eqmEntity.getId()) {
					eqmEntity.getList().add(varEntity);
				}
			}
		}

		return R.ok().put("child", eqmEntitys);
	}

}
